// vim: ft=javascript

// ↓IE でグローバルオブジェクトに高速にアクセスできるようにする
/*@cc_on
eval((function(props) {
    var code = [];
    for (var i = 0,l = props.length;i<l; i++){
        var prop = props[i];
        window['_'+prop]=window[prop];
        code.push(prop+'=_'+prop);
    }
    return 'var '+code.join(',');
})('document self top parent alert setInterval clearInterval setTimeout clearTimeout'.split(' ')));
@*/

var Block = Class.create();
Block.prototype = {
    initialize: function(block_id) {
        this.id = block_id;
    },

    /**
     * 編集ボタンを押下した際の処理
     */
    edit: function() {
        var self = this;
        // テキストエリアが既に存在する場合は表示する
        if (!!$('block_input_' + self.id)) {
            $('block_input_' + self.id).style.display = 'block';
        // テキストエリアが存在しない場合は作成する
        } else {
            var block_input = document.createElement('textarea');
            var panel = $('edit_panel_' + self.id);
            self.block_input = block_input;
            block_input.name = 'block_input['+ self.id +']';
            block_input.id = 'block_input_' + self.id;
            block_input.style.display = 'block'; // テキストエリアは改行する
            block_input.value = $(self.id).getElementsByClassName('wiki_text')[0].value;
            panel.insertBefore(block_input, panel.firstChild);
        }

        $('edit_btn_' + self.id).style.display    = 'none';
        $('apply_btn_' + self.id).style.display   = 'inline';
        $('preview_btn_' + self.id).style.display = 'inline';
        $('cancel_btn_' + self.id).style.display  = 'inline';

//        Element.scrollTo(self.id);
        // ゆっくりスクロールする
        var last_dy = 0;
        self.scroll_observer = new PeriodicalExecuter(function() {
            var from_pos = Content.getWindowOffset();
            var to_pos = Position.cumulativeOffset($(self.id));
            var size = Content.getPageSize();
            // 移動可能な最大サイズを取得
            if (size.pageHeight - size.windowHeight < to_pos[1]) {
                to_pos[1] = size.pageHeight - size.windowHeight;
            }

            // 移動距離が前回と同じ場合は移動を終了する
            from_pos.y += (to_pos[1] - from_pos.y) * 0.3;
//            if ((from_pos.y += (to_pos[1] - from_pos.y) * 0.3) == last_dy) {
            if (Math.abs((from_pos.y += (to_pos[1] - from_pos.y) * 0.3) - last_dy) < 0.5) {
                self.scroll_observer.stop();
                return;
            }
            last_dy = from_pos.y;
            window.scrollTo(to_pos[0], from_pos.y);
        }, 0.04);

    },
    /**
     * 適用ボタンを押下した際の処理
     */
    apply: function() {
        var self = this;

        var param = $H({
            id: $('content_id').value,
            wiki_text: $('block_input_' + self.id).value
        }).toQueryString();

        // 編集中（保存前）フラグを立てる
        if ($('block_input_' + self.id).value != $(self.id).getElementsByClassName('wiki_text')[0].value) {
            main_content.set_unsaved();
        }

        new Ajax.Request(
            window.main_content.id + '/to_html/ajax_wiki',
            {
                method: 'post',
                parameters: param,
                onComplete: function(res) {
                    $(self.id).getElementsByClassName('rendered_html')[0].innerHTML = (!!res.responseText.strip()) ? res.responseText : '&nbsp;';
                    $(self.id).getElementsByClassName('wiki_text')[0].value = $('block_input_' + self.id).value;
                }
            }
        );

        $('edit_btn_' + self.id).style.display    = 'inline';
        $('apply_btn_' + self.id).style.display   = 'none';
        $('preview_btn_' + self.id).style.display = 'none';
        $('cancel_btn_' + self.id).style.display  = 'none';

        // textareaを非表示にする
        $('block_input_' + self.id).style.display = 'none';
    },
    /**
     * プレビューボタンを押下した際の処理
     */
    preview: function() {
        var self = this;
        var param = $H({
            id: $('content_id').value,
            wiki_text: $('block_input_' + self.id).value
        }).toQueryString();

        // 編集中（保存前）フラグを立てる
        if ($('block_input_' + self.id).value != $(self.id).getElementsByClassName('wiki_text')[0].value) {
            main_content.set_unsaved();
        }

        new Ajax.Request(
            window.main_content.id + '/to_html/ajax_wiki',
            {
                method: 'post',
                parameters: param,
                onComplete: function(res) {
                    $(self.id).getElementsByClassName('rendered_html')[0].innerHTML = (!!res.responseText.strip()) ? res.responseText : '&nbsp;';

                    // 一度テキストエリアの中を書き換えないと、Firefoxでテキストデータの表示がずれる
                    var tmp = $('block_input_' + self.id).value;
                    $('block_input_' + self.id).value = '';
                    $('block_input_' + self.id).value = tmp;
                }
            }
        );
    },
    /**
     * キャンセルボタンを押下した際の処理
     */
    cancel: function() {
        var self = this;

        // データを編集前のものに戻す
        $('block_input_' + self.id).value = $(self.id).getElementsByClassName('wiki_text')[0].value;

        var param = $H({
            id: $('content_id').value,
            wiki_text: $('block_input_' + self.id).value
        }).toQueryString();

        new Ajax.Request(
            window.main_content.id + '/to_html/ajax_wiki',
            {
                method: 'post',
                parameters: param,
                onComplete: function(res) {
                    $(self.id).getElementsByClassName('rendered_html')[0].innerHTML = (!!res.responseText.strip()) ? res.responseText : '&nbsp;';
                }
            }
        );

        $('edit_btn_' + self.id).style.display    = 'inline';
        $('apply_btn_' + self.id).style.display   = 'none';
        $('preview_btn_' + self.id).style.display = 'none';
        $('cancel_btn_' + self.id).style.display  = 'none';

        // textareaを非表示にする
        $('block_input_' + self.id).style.display = 'none';
    },
    /**
     * ブロックに編集用の操作パネル・ボタンを追加する
     */
    add_edit_panel: function() {
        var self = this;

        //------------------------------
        // 編集パネル
        //------------------------------
        var panel = document.createElement('div');
        panel.className = 'edit_panel';
        panel.id = 'edit_panel_' + self.id;

        //------------------------------
        // 編集ボタン
        //------------------------------
        var edit_btn = document.createElement('input');
        edit_btn.type = 'button';
        edit_btn.id = 'edit_btn_' + self.id;
        edit_btn.value = '編集';
        edit_btn.className = 'btn edit_btn';
        edit_btn.style.position = 'absolute';
        edit_btn.style.left = '-35px';
        edit_btn.style.top = '0px';
//        edit_btn.style.width = '35px';
//        edit_btn.style.height = '25px';
//        edit_btn.style.border = '1px solid #fff';
//        edit_btn.style.backgroundColor = '#ccc';
        edit_btn.onclick = function() { self.edit(); }
        $(panel).appendChild(edit_btn);

        // HTML部分をクリックしても編集モードに入れる
        var rendered_html = $(self.id).getElementsByClassName('rendered_html')[0];
        rendered_html.onmouseover = function() { Element.addClassName(rendered_html, 'selected'); }
        rendered_html.onmouseout  = function() { Element.removeClassName(rendered_html, 'selected'); }
        rendered_html.onclick     = function() { self.edit(); }

        //------------------------------
        // 適用ボタン
        //------------------------------
        var apply_btn = document.createElement('input');
        apply_btn.type = 'button';
        apply_btn.id = 'apply_btn_' + self.id;
        apply_btn.value = '適用';
        apply_btn.style.display = 'none';
        apply_btn.className = 'btn';
        apply_btn.onclick = function() { self.apply(); }
        $(panel).appendChild(apply_btn);

        //------------------------------
        // プレビューボタン
        //------------------------------
        var preview_btn = document.createElement('input');
        preview_btn.type = 'button';
        preview_btn.id = 'preview_btn_' + self.id;
        preview_btn.value = 'プレビュー';
        preview_btn.style.display = 'none';
        preview_btn.className = 'btn';
        preview_btn.onclick = function() { self.preview(); }
        $(panel).appendChild(preview_btn);

        //------------------------------
        // キャンセルボタン
        //------------------------------
        var cancel_btn = document.createElement('input');
        cancel_btn.type = 'button';
        cancel_btn.id = 'cancel_btn_' + self.id;
        cancel_btn.value = 'キャンセル';
        cancel_btn.style.display = 'none';
        cancel_btn.className = 'btn';
        cancel_btn.onclick = function() { self.cancel(); }
        $(panel).appendChild(cancel_btn);

        $(self.id).appendChild(panel);
    },
    remove_edit_panel: function() {
        var self = this;

        $(self.id).removeChild($('edit_panel_' + self.id));
//        $$('#' + self.id + ' div.edit_panel').each(function(elm) {
//            $(self.id).removeChild(elm);
//            console.log(self.id);
//        });
    },
    /**
     * ブロックに並び替えるためのハンドラを追加する
     */
    add_sort_handler: function() {
        var self = this;
//        // ハンドラを表示する領域を確保する
//        self.last_padding_left = $(self.id).style.paddingLeft; // 後で戻すために paddin を保持する
//        $(self.id).style.paddingLeft = '25px';

        // ハンドラを作成し、appendする
        var handler = document.createElement('div');
        handler.className = 'sort_handler';
        handler.id = 'sort_handler_' + self.id;
        handler.style.height = $(self.id).offsetHeight + 'px';
        handler.style.left = '0px';
        handler.style.top = '0px';
        handler.innerHTML = '<div>▲</div><div>▼</div>';
        $(self.id).appendChild(handler);

//        $(self.id).style.position = 'relative';
        $(self.id).style.height = '100%'; // IEでの表示崩れ対策

        // ブロックのサイズが変更された場合にハンドラのサイズも修正する
        self.size_observer = new PeriodicalExecuter(function() {
            if (self.last_height != $(self.id).offsetHeight) {
                handler.style.height = $(self.id).offsetHeight + 'px';
                self.last_height = $(self.id).offsetHeight;
            }
        }, 0.01);
    },
    /**
     * 保存時に適用するwiki_textを返却する
     */
    wiki_text: function() {
        var self = this;
        return Try.these(
            function() {
                return $('block_input_' + self.id).value;
            },
            function() {
                return $(self.id).getElementsByClassName('wiki_text')[0].value;
            }
        );
    },
    remove_sort_handler: function() {
        var self = this;

        // ブロックのサイズ監視を停止する
        self.size_observer.stop();

//        // 保持していた padding を戻す
//        $(self.id).style.paddingLeft = self.last_padding_left;

        $(self.id).removeChild($('sort_handler_' + self.id));
    },
    update_html: function() {
    }
}

var Content = Class.create();
Content.prototype = {
//    blocks: [],
//    blocks: new Hash,
    unsaved: false,
    mode: 'standby',
    initialize: function() {
        var self = this;

        self.init_blocks();

        self.id = $('content_id').value;
    },

    // 部分編集開始メソッド
    edit: function() {
        var self = this;

        // 待機中の場合に編集を開始できる
        if (self.mode == 'standby') {
            // 空のブロックを追加する
            self.new_block();

            // ブロック要素を全て編集モードに変更する
            self.blocks.values().each(function(block) {
                block.add_edit_panel();
                block.add_sort_handler();
            });

            // ソート開始
            Sortable.create("blocks", {
                handle : 'sort_handler',
                only : 'block',
                onUpdate: function() {
                    self.set_unsaved();
                },
                tag : 'div'
            });

            self.init_controll_panel('edit');

//            // 新規ブロックを編集モードにする
//            $$('#' + self.new_block_id + ' .edit_panel .edit_btn')[0].onclick();

            // モードを編集中に変更する
            self.mode = 'edit';
        }
    },

    // 編集終了（保存）メソッド
    save: function() {
        var self = this;
        // ローディング中表示を出す
        self.mode = 'waiting';
        self.set_waiting();

        // ボタンを使用不可にする
        $A(self.partedit_panel.getElementsByTagName('input')).each(function(elm) { elm.disabled = true;});

        self.execute = function() {
            var challenge_code = arguments[0] || false;

            // リクエストパラメータを作成する
            if (challenge_code) {
                var param = $H({
                    id: $('content_id').value,
                    response_code: SHA1(challenge_code + SHA1($('admin_pass').value)),
                    wiki_text: $A($$('#blocks div.block')).collect(function (elm) {
                        return $A(main_content.blocks).find(function (block) {return (block.key == elm.id)}).value.wiki_text();
                    }).join("\n\n")
                }).toQueryString();
            } else {
                var param = $H({
                    id: $('content_id').value,
                    wiki_text: $A($$('#blocks div.block')).collect(function (elm) {
                        return $A(main_content.blocks).find(function (block) {return (block.key == elm.id)}).value.wiki_text();
                    }).join("\n\n")
                }).toQueryString();
            }

            new Ajax.Request( window.main_content.id + '/save/ajax_wiki', {
                method: 'post',
                parameters: param,
                onComplete: function(res) {
                    self.remove_waiting();
                    var res_obj = eval('(' + res.responseText + ')');

                    switch (res_obj.status) {
                    case 'success':
                        // ハンドラや編集パネルを削除する
                        self.remove_handler();
                        self.remove_unsaved();
                        self.mode = 'standby';

                        $('controll_panel').removeChild(self.partedit_panel);
                        self.init_controll_panel('view');

                        $('blocks').innerHTML = res_obj.value;
                        self.init_blocks();

                        break;
                    case 'error':

                        self.mode = 'edit';
                        $A(self.partedit_panel.getElementsByTagName('input')).each(function(elm) { elm.disabled = false;});
                        alert(res_obj.value);
                        break;
                    }
                }
            });
        }

        // 凍結状態の場合、最初にチャレンジコードを取得する
        if ($('freeze_flag').value == 1) {
            // リクエストパラメータを作成する
            var param = $H({
                id: $('content_id').value
            }).toQueryString();

            // チャレンジコードを取得する
            new Ajax.Request(window.main_content.id + '/get_challenge_code/ajax_wiki', {
                method: 'post',
                parameters: param,
                onComplete: function(res) {
                    self.execute(res.responseText);
                }
            });
        } else {
            self.execute();
        }


    },
    // キャンセルボタン押下時のメソッド
    cancel: function() {
        var self = this;
        // 確認画面
        if (self.unsaved) {
            if (!confirm('最後に保存した状態に戻しますが、よろしいですか？')) {
                return;
            }
        }

        self.remove_handler();

        // リクエストパラメータを作成する
        var param = $H({
            id: $('content_id').value
        }).toQueryString();

        // ローディング中表示を出す
        self.mode = 'waiting';
        self.set_waiting();

        // ボタンを使用不可にする
        $A(self.partedit_panel.getElementsByTagName('input')).each(function(elm) { elm.disabled = true;});
        new Ajax.Request(
            window.main_content.id + '/index/ajax_wiki',
            {
                method: 'post',
                parameters: param,
                onComplete: function(res) {
                    self.remove_waiting();

                    $('blocks').innerHTML = res.responseText;
                    $('controll_panel').removeChild(self.partedit_panel);
                    //$('controll_panel').removeChild(self.save_btn);
                    //$('controll_panel').removeChild(self.cancel_btn);
                    self.init_blocks();
                    self.remove_unsaved();
                    self.mode = 'standby';
//                    $('view_mode').show();
                    self.init_controll_panel('view');
                }
            }
        );
    },

    // 凍結状態編集の開始メソッド
    freeze: function(flag) {
        var self = this;

        // 待機中の場合に編集を開始できる
        if (self.mode == 'standby') {

            self.freeze_flag = flag;
            self.init_controll_panel('freeze');

            // モードを編集中に変更する
            self.mode = 'edit';
        }
    },

    // 凍結状態を保存する
    save_freeze: function() {
        var self = this;
        // ローディング中表示を出す
        self.mode = 'waiting';
        self.set_waiting();

        // ボタンを使用不可にする
        $A(self.freeze_panel.getElementsByTagName('input')).each(function(elm) { elm.disabled = true;});

        // リクエストパラメータを作成する
        var param = $H({
            id: $('content_id').value
        }).toQueryString();

        // チャレンジコードを取得する
        new Ajax.Request(window.main_content.id + '/get_challenge_code/ajax_wiki', {
            method: 'post',
            parameters: param,
            onComplete: function(res) {

                // チャレンジコードを使用してレスポンスコードを含んだリクエストパラメータを生成
                var param = $H({
                    id: $('content_id').value,
                    freeze_flag: self.freeze_flag,
                    response_code: SHA1(res.responseText + SHA1($('admin_pass').value))
                }).toQueryString();

                new Ajax.Request(window.main_content.id + '/save/ajax_wiki', {
                    method: 'post',
                    parameters: param,
                    onComplete: function(res) {
                        self.remove_waiting();
                        var res_obj = eval('(' + res.responseText + ')');

                        //$('blocks').innerHTML = res.responseText;
                        switch (res_obj.status) {
                        case 'success':

                            $('freeze_flag').value = res_obj.freeze_flag;
                            $('controll_panel').removeChild(self.freeze_panel);
                            self.init_controll_panel('view');
                            self.mode = 'standby';

                            if (res_obj.freeze_flag == 1) {
                                $('freeze_flag_link').innerHTML = '凍結解除';
                                $('freeze_flag_link').onclick = function() { main_content.freeze(0) };
                                alert('凍結しました');
                            } else {
                                $('freeze_flag_link').innerHTML = '凍結';
                                $('freeze_flag_link').onclick = function() { main_content.freeze(1) };
                                alert('凍結を解除しました');
                            }

                            break;
                        case 'error':
                            alert(res_obj.value);
                            // ボタンを使用可能にする
                            $A(self.freeze_panel.getElementsByTagName('input')).each(function(elm) { elm.disabled = false;});
                            break;
                        }
                    }
                });
            }
        });

    },
    // キャンセルボタン押下時のメソッド
    cancel_freeze: function() {
        var self = this;

        // テキストボックス・ボタンを削除する
        $('controll_panel').removeChild(self.freeze_panel);
        self.mode = 'standby';
        self.init_controll_panel('view');
    },

    // ドラッグハンドラ・編集パネルを削除する
    remove_handler: function() {
        var self = this;

        // ブロック要素を全て元に戻す
        self.blocks.values().each(function(block) {
            block.remove_sort_handler();
            block.remove_edit_panel();
        });

//        // ブロック要素を破棄
//        self.destroy_blocks();
    },
    preview: function() {
    },
    new_block: function() {
        var self = this;

        // リクエストパラメータを作成する
        var new_block_id = 0;
//        $('blocks').getElementsByClassName('block').each(function(elm, index) {
        $$('#blocks div.block').each(function(elm, index) {
            if (new_block_id <= parseInt(elm.id.split('_')[1])) {
                new_block_id = parseInt(elm.id.split('_')[1]) + 1;
            }
        });
        new_block_id = $('content_id').value + '_' + new_block_id.toString();

        var div_rendered_html = document.createElement('div');
        div_rendered_html.className = 'rendered_html';
        div_rendered_html.innerHTML = '&nbsp;';

        var input_hidden = document.createElement('input');
        input_hidden.className = 'wiki_text';
        input_hidden.type = 'hidden';
        input_hidden.value = '';
        input_hidden.name = 'block['+new_block_id+']';

        var div_block = document.createElement('div');
        div_block.id = new_block_id;
        div_block.className = 'block';
        div_block.appendChild(div_rendered_html);
        div_block.appendChild(input_hidden);

        $('blocks').appendChild(div_block);

        self.blocks[new_block_id] = new Block(new_block_id);
        self.new_block_id = new_block_id;

//        var param = $H({
//            block_id: $('content_id').value + '_' + new_block_id.toString()
//        }).toQueryString();
//
//        new Ajax.Request(
//            '_ctrl/ajax_wiki/new_block',
//            {
//                method: 'post',
//                parameters: param,
//                onComplete: function(res) {
//                    $('blocks').innerHTML += res.responseText;
//                    self.blocks[new_block_id] = new Block(new_block_id);
//                    // 編集モードにする
//                    self.blocks[new_block_id].add_edit_panel();
//                    self.blocks[new_block_id].add_sort_handler();
//                }
//            }
//        );
    },

    /**
     * ブロック要素をオブジェクトにして配列に格納する
     */
    init_blocks: function() {
        var self = this;

        self.blocks = new Hash();
        $$('#blocks div.block').each(function(elm, index) {
//            self.blocks[index] = new Block(elm.id);
            self.blocks[elm.id] = new Block(elm.id);
        });
    },

    /**
     * ローディングアニメーションを表示する
     * @see image generator http://www.ajaxload.info/
     */
    set_waiting: function() {
        var waiting = document.createElement('div');
        document.body.appendChild(waiting);
        waiting.id = 'waiting';
//        waiting.innerHTML = '<div class="blackout"></div>';

        var waiting_text = document.createElement('div');
        waiting.appendChild(waiting_text);
        waiting_text.style.display = 'none';

        var page_size = Content.getPageSize();
        var winsow_offset = Content.getWindowOffset();

        waiting_text.className = 'waiting_text';
//        waiting_text.innerHTML = '<img src="<%= url_for('/images/icons/ajax-loader.gif') %>" width="24" height="24" alt="" title="" /><span> please wait ...</span>';
        waiting_text.innerHTML = '<img src="images/icons/ajax-loader.gif" width="24" height="24" alt="" title="" /><span> please wait ...</span>';
        waiting_text.style.top = (winsow_offset.y + (page_size.windowHeight / 2) - (Element.getHeight(waiting_text) / 2)) + 'px';
        waiting_text.style.left = (winsow_offset.x + (page_size.windowWidth / 2) - (Element.getWidth(waiting_text) / 2)) + 'px';
        waiting_text.style.display = 'block';
    },

    /**
     * ローディングアニメーションを停止する
     */
    remove_waiting: function() {
        document.body.removeChild($('waiting'));
    },

    /**
     * 編集中フラグを設定する
     */
    set_unsaved: function() {
        this.unsaved = true;
        $('unsaved').innerHTML = '[+]';
        window.onbeforeunload = function() {
            return '移動すると編集中のデータは破棄されます。';
        }

    },
    /**
     * 編集中フラグを削除
     */
    remove_unsaved: function() {
        this.unsaved = false;
        $('unsaved').innerHTML = '';
        window.onbeforeunload = function() {};
    },

    /**
     * ブロック要素を破棄する
     */
    destroy_blocks: function() {
        var self = this;
        self.blocks = [];
    },

    update_html: function() {
    },

    /**
     * コントロールパネルに表示するボタンを制御する
     */
    init_controll_panel: function(mode) {
        var self = this;

        switch (mode) {
        case 'edit': // 部分編集
            //-----------------------------
            // 部分編集のパネルを作成
            //-----------------------------
            self.partedit_panel = document.createElement('span');
            $('controll_panel').appendChild(self.partedit_panel);

            // 凍結フラグが設定されている場合は、パスワード入力ボックスを表示する
            if ($('freeze_flag').value == 1) {

                //------------------------------
                // メッセージ
                //------------------------------
                var message = document.createElement('span');
                message.innerHTML = 'パスワード:';
                self.partedit_panel.appendChild(message);

                //------------------------------
                // パスワード入力ボックス
                //------------------------------
                var pass_input = document.createElement('input');
                pass_input.type = 'password';
                pass_input.id = 'admin_pass';
                self.partedit_panel.appendChild(pass_input);
            }

            //------------------------------
            // 保存ボタン
            //------------------------------
            var save_btn = document.createElement('input');
            save_btn.type = 'button';
            save_btn.value = '保存';
            save_btn.className = 'edit_btn';
            save_btn.onclick = function() { self.save(); }
            self.partedit_panel.appendChild(save_btn);

            //------------------------------
            // キャンセルボタン
            //------------------------------
            var cancel_btn = document.createElement('input');
            cancel_btn.type = 'button';
            cancel_btn.value = 'キャンセル';
            cancel_btn.className = 'edit_btn';
            cancel_btn.onclick = function() { self.cancel(); }
            self.partedit_panel.appendChild(cancel_btn);


            // その他の操作を非表示にする
            $('view_mode').hide();
            break;
        case 'freeze': // 凍結
            //-----------------------------
            // 凍結状態の編集パネルを作成
            //-----------------------------
            self.freeze_panel = document.createElement('span');
            $('controll_panel').appendChild(self.freeze_panel);

            //------------------------------
            // メッセージ
            //------------------------------
            var message = document.createElement('span');
            message.innerHTML = 'パスワード:';
            self.freeze_panel.appendChild(message);

            //------------------------------
            // パスワード入力ボックス
            //------------------------------
            var pass_input = document.createElement('input');
            pass_input.type = 'password';
            pass_input.style.width = '100px';
            pass_input.id = 'admin_pass';
            self.freeze_panel.appendChild(pass_input);

            //------------------------------
            // パスワード送信ボタン
            //------------------------------
            var save_btn = document.createElement('input');
            save_btn.type = 'button';
            if (self.freeze_flag == 1) {
                save_btn.value = '凍結する';
            } else {
                save_btn.value = '凍結を解除する';
            }
            save_btn.className = 'edit_btn';
            save_btn.onclick = function() { self.save_freeze(); }
            self.freeze_panel.appendChild(save_btn);

            //------------------------------
            // キャンセルボタン
            //------------------------------
            var cancel_btn = document.createElement('input');
            cancel_btn.type = 'button';
            cancel_btn.value = 'キャンセル';
            cancel_btn.className = 'edit_btn';
            cancel_btn.onclick = function() { self.cancel_freeze(); }
            self.freeze_panel.appendChild(cancel_btn);

            // その他の操作を非表示にする
            $('view_mode').hide();
            break;
        case 'view':
            $('view_mode').show();
            break;
        }

    }
}

/**
 * 表示中ウィンドウのXY座標を取得する
 *
 * @see http://www2.ocn.ne.jp/~yoochan/decoration/JavaScript/library_dom.htm
 * @return num
 */
Content.getWindowOffset = function(){
    return {
        y: (function() {
            if (window.scrollY) {
                return window.scrollY; // Mozilla
            } else if(window.pageYOffset) {
                return window.pageYOffset; // Opera, NN4
            } else if(document.documentElement && document.documentElement.scrollTop) { // 以下 IE
                return document.documentElement.scrollTop;
            } else if(document.body && document.body.scrollTop) {
                return document.body.scrollTop;
            }
            return 0;
        })(),
        x: (function() {
            if (window.scrollX) {
                return window.scrollX; // Moziila
            } else if (window.pageXOffset) {
                return window.pageXOffset; // Opera, NN4
            } else if (document.documentElement && document.documentElement.scrollLeft) { // 以下 IE
                return document.documentElement.scrollLeft;
            } else if (document.body && document.body.scrollLeft) {
                return document.body.scrollLeft;
            }
            return 0;
        })()
    }
}

/**
 * ページやウィンドウのサイズを取得する
 *
 * @see http://www.huddletogether.com/projects/lightbox/
 * @return obj サイズ情報の連想配列
 */
Content.getPageSize = function() {

    var xScroll, yScroll;

    if (window.innerHeight && window.scrollMaxY) {
        xScroll = document.body.scrollWidth;
        yScroll = window.innerHeight + window.scrollMaxY;
    } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
        xScroll = document.body.scrollWidth;
        yScroll = document.body.scrollHeight;
    } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
        xScroll = document.body.offsetWidth;
        yScroll = document.body.offsetHeight;
    }

    var windowWidth, windowHeight;
    if (self.innerHeight) {    // all except Explorer
        windowWidth = self.innerWidth;
        windowHeight = self.innerHeight;
    } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
        windowWidth = document.documentElement.clientWidth;
        windowHeight = document.documentElement.clientHeight;
    } else if (document.body) { // other Explorers
        windowWidth = document.body.clientWidth;
        windowHeight = document.body.clientHeight;
    }

    var pageHeight, pageWidth;
    // for small pages with total height less then height of the viewport
    if(yScroll < windowHeight){
        pageHeight = windowHeight;
    } else {
        pageHeight = yScroll;
    }

    // for small pages with total width less then width of the viewport
    if(xScroll < windowWidth){
        pageWidth = windowWidth;
    } else {
        pageWidth = xScroll;
    }

    return {
        'pageWidth':pageWidth,
        'pageHeight':pageHeight,
        'windowWidth':windowWidth,
        'windowHeight':windowHeight
    }
}


// コンテンツオブジェクトを生成する
window.onload = function() {
    window.main_content = new Content();
}
